//
//  CZPictureView.swift
//  Weibo24
//
//  Created by apple on 16/3/1.
//  Copyright © 2016年 apple. All rights reserved.
//

import UIKit
import SDWebImage

/*
    1.需要解决的一个重要问题,就是如何去改变视图的宽高
    
    图片1张的时候,我们可以返回一个item宽高,也可以返回 宽 = itemW * 3 + 2 * itemMargin ,高 itemH
    2,3张图片 宽 = itemW * 3 + 2 * itemMargin ,高 itemH

    4张图片, 宽 = itmeW * 2 + itemMargin 高 = 宽
    
    5,6, 宽 = itemW * 3 + 2 * itemMargin ,高 (itemH + itemMarin)*2


    7,8,9 宽 = itemW * 3 + 2 * itemMargin ,高 (itemH + itemMarin)*3


    我们知道宽高 -- 什么去修改宽高?
    当我们给 视图的Model赋值的时候,去修改,

1.数据--也就是接口文档
2.分析页面 -- 添加一个Label
3.实现功能 --

*/

//定义(相当于宏)常量的时候,最好把他定义在类外边
//定义一个间距
let ItemMargin: CGFloat = 10
let pictureMargin: CGFloat = 5
//定义一个itemWidth
let ItemWH = (kUIScreenWidth - 4 * ItemMargin)/3
//定义一个cell重用表示
let CZPictureViewCollectionViewReuserIdentifer = "CZPictureViewCollectionViewReuserIdentifer"

class CZPictureView: UICollectionView,UICollectionViewDataSource {

    
    // 赋值的时候,知道已经计算好宽高,然后再更新约束
    // 最初这个是原创微博的, 但是由于转发微博的图片在转发的ViewModel里,所以需要加一个标志位
    
//    var pictureViewModel: CZStatusViewModel?{
//    
//        didSet{
//        
//            //更新配图的约束
//            self.snp_updateConstraints { (make) -> Void in
//                
//                
//                let size = self.calPictureSize()
//                make.width.equalTo(size.width)
//                make.height.equalTo(size.height)
//                
//            }
//            //赋值之后,是不是需要重载加载数据
//            reloadData()
//        }
//        
//    }
//    
    
    //对外统一一个数组,这个数组,转发微博和原创微博都可以传递进来数据
    
    var pictureList: [CZPictureViewModel]?{
    
        didSet{
            //更新配图的约束
            self.snp_updateConstraints { (make) -> Void in
                
                
                let size = self.calPictureSize()
                make.width.equalTo(size.width)
                make.height.equalTo(size.height)
                
            }
            
            addSubview(label)
            //让测试label居中显示
            label.snp_makeConstraints { (make) -> Void in
                make.center.equalTo(self.snp_center)
            }
            
            label.text = "\(pictureList?.count ?? 0)"
            
            //赋值之后,是不是需要重载加载数据
            reloadData()
        }
        
    }
    
    
    //传递数据
    // 刚才我把lazy去掉,就没有报错了?
    var flowLayout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        //设置流水布局
        super.init(frame: frame, collectionViewLayout:flowLayout)
        
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    /*
        千万不要纠结于一个问题不放.
        问题一: cell的大小
        问题二: 显示的数量不对
    */
    private func setupUI(){
    
        
        backgroundColor = UIColor.whiteColor()
        
        /*
            1.实现CollectionView的数据源方法
            2.设置 flowlayout 以及UICollectionView的属性
            3.显示图片 -- 自定义Cell
        */
        self.dataSource = self
        
        //注册cell
        self.registerClass(CZPictureViewCollectionCell.self, forCellWithReuseIdentifier: CZPictureViewCollectionViewReuserIdentifer)
        //设置水平 --水平可以不设置,因为我们设置了它的item他会自己的排布
//        flowLayout.scrollDirection = UICollectionViewScrollDirection.Horizontal
       
        //设置cell的大小
        // 宽高,大一小点
        flowLayout.itemSize = CGSizeMake(ItemWH-1, ItemWH-1)
        flowLayout.minimumInteritemSpacing = ItemMargin
        flowLayout.minimumLineSpacing = ItemMargin
        
        /* 这个问题就是我们设置的 itemSize与实际的大小不一致,导致的
            如果 itemSize 大,就会报错
            如果 itemSize 小,不会报错,但是效果(间隔会很大)不好
        
        The relevant UICollectionViewFlowLayout instance is <UICollectionViewFlowLayout: 0x7f9fb5d4ba40>, and it is attached to <Weibo24.CZPictureView: 0x7f9fb406f400; baseClass = UICollectionView; frame = (10 159.667; 394 124.667); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x7f9fb3c95ad0>; layer = <CALayer: 0x7f9fb3c97450>; contentOffset: {0, 0}; contentSize: {394.00000000000006, 404}> collection view layout: <UICollectionViewFlowLayout: 0x7f9fb5d4ba40>.
        2016-03-04 09:05:36.573 Weibo24[2250:146434] Make a symbolic breakpoint at UICollectionViewFlowLayoutBreakForInvalidSizes to catch this in the debugger.

        */
    }
    
    
    //计算配图视图的宽高
    private func calPictureSize() -> CGSize{
    
        // 需要根据图片的个数
        let count = pictureList?.count //pictureViewModel?.statusModel?.pic_urls?.count
        
        print(count)
        
        //
        if count <= 3{
            
            //宽 = itemW * 3 + 2 * itemMargin ,
            //高 itemH
          return CGSizeMake(ItemWH * 3 + 2 * ItemMargin, ItemWH)
            
        } else if count == 4 {
            //4张图片, 宽 = itmeW * 2 + itemMargin 高 = 宽
            return CGSizeMake(ItemWH * 2 + ItemMargin, ItemWH * 2 + ItemMargin)
            
        } else {
            // 这里
            let row = CGFloat((count! - 1)/3 + 1)
            
            return CGSizeMake(kUIScreenWidth - 2 * ItemMargin, (ItemMargin + ItemWH)*row)


        }
        
        
    }
    
    //添加一个测试label
    private lazy var label: UILabel = {
        
        let label = UILabel()
        
        return label
    }()
}

// 代码模块化
extension CZPictureView{

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
//        return pictureViewModel?.statusModel?.pic_urls?.count ?? 0
        
//        printLog(pictureList?.count)
        return pictureList?.count ?? 0
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(CZPictureViewCollectionViewReuserIdentifer, forIndexPath: indexPath) as! CZPictureViewCollectionCell
        
        //调试方便,随机颜色
        
        cell.backgroundColor = randomColor()        
//        let viewModel = CZPictureViewModel()
//        
//        viewModel.model = pictureViewModel?.statusModel?.pic_urls![indexPath.item]
        
        cell.pictureViewModel = pictureList![indexPath.item]
        
        return cell
    }
    
}

class CZPictureViewCollectionCell: UICollectionViewCell {
    
    //数据传值
    //MVVM
    var pictureViewModel: CZPictureViewModel?{
    
        didSet{
            
        
            let url = NSURL(string: pictureViewModel?.model?.thumbnail_pic ?? "")
            
            if let Ourl = url {
            
                iconImageView.sd_setImageWithURL(Ourl)
            }
            
        }
        
    }
    
    // 三部曲
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    //
    private func setupUI(){
    
        addSubview(iconImageView)
        
        //
        iconImageView.frame = self.bounds
        
        
    }
    
    
    //MARK:--懒加载
    
    private lazy var iconImageView: UIImageView = {
    
        let img = UIImageView()
        
        return img
    }()
    
    
}
